package GUI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;

public class DIY_JFrame extends JFrame {
    // 中央面板，使用GridBagLayout布局
    private JPanel cenPanel = new JPanel(new GridBagLayout());
    // 北部面板，用于放置顶部标签
    private JPanel norPanel = new JPanel();
    // 标题标签
    private JLabel l1 = new JLabel("自定义CloudSim实例", JLabel.CENTER);
    // 计算任务量标签
    private JLabel l2 = new JLabel("选择计算任务量:");
    // 虚拟机数量标签
    private JLabel l3 = new JLabel("选择虚拟机数量:");
    // 开发者信息标签
    private JLabel l4 = new JLabel("信管创新班22-1 2022215030 朱建宇");
    // 调度算法选择标签
    private JLabel l5 = new JLabel("选择调度算法:");

    // 下拉框用于选择任务量
    private JComboBox<String> taskComboBox = new JComboBox<>();
    // 下拉框用于选择虚拟机数量
    private JComboBox<String> vmComboBox = new JComboBox<>();
    // 下拉框用于选择调度算法
    private JComboBox<String> algorithmComboBox = new JComboBox<>();
    // 点击运行标签
    private JLabel clickRunLabel = new JLabel("点击运行", JLabel.CENTER);

    public DIY_JFrame() {
        super();

        // 获取窗口的内容面板
        Container container = getContentPane();

        // 设置字体样式
        setFontStyle();

        // 设置组件
        setupComponents(container);

        // 为点击“点击运行”标签添加鼠标事件监听
        clickRunLabel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                handleButtonClick();  // 处理按钮点击事件
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                clickRunLabel.setForeground(new Color(40, 43, 47, 116)); // 鼠标悬停时改变文字颜色
            }

            @Override
            public void mouseExited(MouseEvent e) {
                clickRunLabel.setForeground(new Color(0, 0, 0)); // 鼠标离开时恢复文字颜色
            }
        });

        // 设置窗口大小和关闭行为
        setSize(700, 650);
        setLocationRelativeTo(null);  // 窗口居中显示
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);  // 显示窗口
    }

    // 设置字体样式
    private void setFontStyle() {
        l1.setFont(new Font("微软雅黑", Font.BOLD, 45));  // 设置标题字体
        l2.setFont(new Font("微软雅黑", Font.BOLD, 25)); // 设置任务量标签字体
        l3.setFont(new Font("微软雅黑", Font.BOLD, 25)); // 设置虚拟机数量标签字体
        l5.setFont(new Font("微软雅黑", Font.BOLD, 25)); // 设置调度算法标签字体
        clickRunLabel.setFont(new Font("微软雅黑", Font.BOLD, 30)); // 设置点击运行标签字体

        l4.setFont(new Font("微软雅黑", Font.BOLD, 15)); // 设置开发者信息字体

        // 设置标签颜色
        Color labelColor = new Color(0, 0, 0);
        l1.setForeground(labelColor);
        l2.setForeground(labelColor);
        l3.setForeground(labelColor);
        l5.setForeground(labelColor);
        l4.setForeground(labelColor);

        // 设置点击运行标签背景和前景色
        clickRunLabel.setBackground(new Color(240, 240, 240));
        clickRunLabel.setForeground(new Color(0, 0, 0));
        clickRunLabel.setOpaque(true); // 设置标签背景可见
    }

    // 设置界面组件
    private void setupComponents(Container container) {
        // 任务量下拉框选项
        for (int i = 1; i <= 10; i++) {
            taskComboBox.addItem(String.valueOf(i)); // 添加任务量选项
        }
        taskComboBox.setFont(new Font("微软雅黑", Font.PLAIN, 17));  // 设置下拉框字体
        taskComboBox.setPreferredSize(new Dimension(200, 30));  // 设置下拉框大小

        // 虚拟机数量下拉框选项
        for (int i = 1; i <= 5; i++) {
            vmComboBox.addItem(String.valueOf(i)); // 添加虚拟机数量选项
        }
        vmComboBox.setFont(new Font("微软雅黑", Font.PLAIN, 17));  // 设置下拉框字体
        vmComboBox.setPreferredSize(new Dimension(200, 30));  // 设置下拉框大小

        // 调度算法下拉框选项
        algorithmComboBox.addItem("最短剩余时间优先调度");
        algorithmComboBox.addItem("模拟退火调度");
        algorithmComboBox.setFont(new Font("微软雅黑", Font.PLAIN, 17)); // 设置下拉框字体
        algorithmComboBox.setPreferredSize(new Dimension(200, 30)); // 设置下拉框大小

        // 设置北部面板布局和添加组件
        norPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        norPanel.add(l1);

        // 设置GridBagLayout的约束并将组件添加到中央面板
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(20, 0, 20, 0);
        gbc.anchor = GridBagConstraints.CENTER;
        cenPanel.add(l1, gbc);

        gbc.gridwidth = 1;
        gbc.gridy = 1;
        cenPanel.add(l2, gbc);
        gbc.gridx = 1;
        cenPanel.add(taskComboBox, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        cenPanel.add(l3, gbc);
        gbc.gridx = 1;
        cenPanel.add(vmComboBox, gbc);

        gbc.gridx = 0;
        gbc.gridy = 3;
        cenPanel.add(l5, gbc);
        gbc.gridx = 1;
        cenPanel.add(algorithmComboBox, gbc);

        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.gridwidth = 2;
        cenPanel.add(clickRunLabel, gbc);

        gbc.gridy = 5;
        cenPanel.add(l4, gbc);

        // 将面板添加到窗口的内容面板中
        container.add(norPanel, BorderLayout.NORTH);
        container.add(cenPanel, BorderLayout.CENTER);
    }

    // 处理点击运行标签的事件
    private void handleButtonClick() {
        // 创建一个文件用于输出调度结果
        File file = new File("D:\\1.txt");
        // 创建一个新的窗口用于显示调度结果
        JFrame frame1 = new JFrame("模拟调度结果");
        JTextArea JT = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(JT);
        scrollPane.setBounds(50, 200, 500, 300); // 设置滚动面板的位置和大小
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        // 获取用户选择的计算任务量和虚拟机数量
        int cloudNum = Integer.parseInt((String) taskComboBox.getSelectedItem());
        int vmNum = Integer.parseInt((String) vmComboBox.getSelectedItem());

        // 获取用户选择的调度算法
        String selectedAlgorithm = (String) algorithmComboBox.getSelectedItem();
        int index = selectedAlgorithm.equals("最短剩余时间优先调度") ? 0 : 1;

        try {
            // 设置SRTF和SAS算法的任务量和虚拟机数量
            SRTF.cloudletNum = cloudNum;
            SRTF.vmNum = vmNum;
            SAS.cloudletNum = cloudNum;
            SAS.vmNum = vmNum;

            // 将控制台输出重定向到文件
            PrintStream ps = new PrintStream(file);
            System.setOut(ps);

            // 根据选择的调度算法运行相应的程序
            switch (index) {
                case 0:
                    SRTF.main(new String[]{}); // 运行最短剩余时间优先调度
                    break;
                case 1:
                    SAS.main(new String[]{}); // 运行模拟退火调度
                    break;
            }

            // 读取调度结果并显示在文本框中
            BufferedReader br = new BufferedReader(new FileReader(file));
            String s;
            while ((s = br.readLine()) != null) {
                JT.append(s + "\n");
            }
            br.close();

        } catch (IOException exception) {
            exception.printStackTrace();
        }

        // 设置文本框样式
        JT.setFont(new Font("Roboto", Font.PLAIN, 18));
        JT.setEditable(false);  // 设置文本框不可编辑
        frame1.add(scrollPane);
        frame1.setBounds(400, 80, 900, 700);  // 设置调度结果窗口的位置和大小
        frame1.setVisible(true);  // 显示调度结果窗口
    }
}
